enum obj { a = 1, b, c } // 键值对的双向映射
// a = 1 即为初始化器 或者初始化表达式（函数除外） 后续的项就从 2 开始自增长

function getValue(): number {
  return 123
}

// 函数表达式不作为任意一项的基准值 就不会报错
enum obj2 { a, b, c = getValue(), d = 124, e }

// 字符串类型的值 不会双向映射
enum strs {
  a = '1',
  b = '2',
  c = '3'
}

// 联合枚举 可用于接口的类型检测
enum ShapeKind {
  circle,
  square
}

interface Circle {
  kind: ShapeKind.circle,
  radius: number
}

interface Square {
  kind: ShapeKind.square,
  radius: number
}

let cir: Circle = {
  kind: 0,
  // kind: 1 就报错 只能是 0
  radius: 100
}

// 常量枚举 编译后不会出现在 js 文件里 
const enum Enum {
  A = 1,
  B = 2
}
// 只能访问属性 不能直接访问它本身
console.log(Enum.A);

// 编译之后 是一个深拷贝 var direct = [0 /* A */ ,1 /* B */]
let direct = [Enum.A, Enum.B]

// 外部枚举 用来描述已经存在的枚举类型的形状
declare enum obj3 {
  a,
  b = 1,
  c = 2
}
// 外部枚举 如果没有初始化器 obj3.a 就不存在 普通枚举会把它计算为 0

